package org.uma.kri.nyu.mor.almas;

import java.util.Calendar;
import java.util.Date;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.CallLog;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

/**
 * 履歴表示フラグメント
 * @author kri
 */
public class HistoryFragment extends Fragment {
	
	private static final String TAG = "HistoryFragment";
	private static final String HISTORY_DATE   = "DATE";
	private static final String HISTORY_NAME   = "NAME";
	private static final String HISTORY_NUMBER = "NUMBER";	
	private static final String HISTORY_TYPE   = "TYPE";
	private TableLayout tableLayout;
	
	public HistoryFragment() {
		// Required empty public constructor
	}
	
	/***
	 * Activityに関連付けされた際に一度だけ呼び出される
	 */
	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		Log.d(TAG, "onAttach");
	}
	
	/***
	 * Fragmentの初期化処理を行う
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.d(TAG, "onCreate");
	}
	
	/***
	 * FragmentのView階層を生成し戻り値として返す
	 */
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		Log.d(TAG, "onCreateView");
		return inflater.inflate(R.layout.fragment_history, container, false);
	}
	
	/***
	 * 親となるActivityの「onCreate」の終了を知らせる
	 */
	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		Log.d(TAG, "onActivityCreated");
		
		tableLayout = (TableLayout)getView().findViewById(R.id.histry_tablelayout);
	}
	
	/***
	 * Activityの「onStart」に基づき開始される
	 */
	@Override
	public void onStart() {
		super.onStart();
		Log.d(TAG, "onStart");
	}
	
	/***
	 * Activityの「onResume」に基づき開始される
	 */
	@Override
	public void onResume() {
		super.onResume();
		Log.d(TAG, "onResume");
		
		// 端末から履歴情報を取得する
		ContentResolver resolver = getActivity().getContentResolver();
		Cursor cursor = resolver.query(
				CallLog.Calls.CONTENT_URI,// データの種類 
				null,// 項目(null 全項目)
				null,// フィルタ条件(null　フィルタなし)
				null,// フィルタ用パラメータ
				CallLog.Calls.DEFAULT_SORT_ORDER// ソート
				);		
		// Table Viewを作成する
		if(cursor.moveToFirst()) {
			// Queryで取得した件数分　繰返し
			do {
				// イベントタイム
				Date date = new Date(cursor.getLong(cursor.getColumnIndex(HISTORY_DATE)));
				Calendar evdt = Calendar.getInstance();
				evdt.setTime(date);
				// 名前
				String evnm = cursor.getString(cursor.getColumnIndex(HISTORY_NAME));
				// 電話番号
				String evnb = cursor.getString(cursor.getColumnIndex(HISTORY_NUMBER));
				// 種別（発信/着信/不在着信）
				String evty = cursor.getString(cursor.getColumnIndex(HISTORY_TYPE));
				// 全ての項目がnullでない場合
				if (evdt != null && evnm != null && evnb != null) {

					// Table Rowの追加
					tableLayout.addView(makeTableRow(evdt, evnm, evnb, evty));
				}
			} while(cursor.moveToNext());
		}
		// Cursorを解放
		cursor.close();
	}
	
	/***
	 * Activityが「onPause」になった場合や、Fragmentが変更更新されて操作を受け付けなくなった場合に呼び出される
	 */
	@Override
	public void onPause() {
		super.onPause();
		Log.d(TAG, "onPause");
	}
	
	/***
	 * フォアグラウンドでなくなった場合に呼び出される
	 */
	@Override
	public void onStop() {
		super.onStop();
		Log.d(TAG, "onStop");
	}
	
	/***
	 * Fragmentの内部のViewリソースの整理を行う
	 */
	@Override
	public void onDestroyView() {
		super.onDestroyView();
		Log.d(TAG, "onDestroyView");
	}
	
	/***
	 * Fragmentが破棄される時、最後に呼び出される
	 */
	@Override
	public void onDestroy() {
		super.onDestroy();
		Log.d(TAG, "onDestroy");
	}
	
	/***
	 * Activityの関連付けから外された時に呼び出される
	 */
	@Override
	public void onDetach() {
		super.onDetach();
		Log.d(TAG, "onDetach");
	}
	
	/**
	 * TableLayoutの動的生成
	 */
	private TableRow makeTableRow(Calendar eventDate, String eventName, String eventNumber, String eventType) {
		
		TableRow returnRow = new TableRow(getView().getContext());
		
		// LEFT UP LAYEAR
		LinearLayout leftUpLayear = new LinearLayout(getView().getContext());
		leftUpLayear.setOrientation(LinearLayout.HORIZONTAL);
		// NAME
		TextView tvName = new TextView(getView().getContext());
		tvName.setText(eventName);
		tvName.setTextSize(20);
		// TYPE
		TextView tvType = new TextView(getView().getContext());
		tvType.setText(eventType);
		tvType.setTextSize(20);
		leftUpLayear.addView(tvName);
		leftUpLayear.addView(tvType);
		// LEFT DOWN LAYEAR
		LinearLayout leftDownLayear = new LinearLayout(getView().getContext());		
		leftDownLayear.setOrientation(LinearLayout.HORIZONTAL);
		// NUMBER & DATE
		// TODO 電話番号と履歴日時の間を空ける
		TextView tvNumber = new TextView(getView().getContext());
		tvNumber.setText(eventNumber);
		tvNumber.setTextSize(15);
		TextView tvDate = new TextView(getView().getContext());
		String dateStr = getDateTime(eventDate);
		tvDate.setText(dateStr);
		tvDate.setTextSize(15);
		leftDownLayear.addView(tvNumber);
		leftDownLayear.addView(tvDate);
		// LEFT Layear
		LinearLayout leftLayear = new LinearLayout(getView().getContext());
		leftLayear.setOrientation(LinearLayout.VERTICAL);
		leftLayear.addView(leftUpLayear);
		leftLayear.addView(leftDownLayear);
		// PARENT LAYEAR
		LinearLayout parentLayear = new LinearLayout(getView().getContext());
		parentLayear.setOrientation(LinearLayout.HORIZONTAL);
		// USER PICT
		ImageView imgView = new ImageView(getView().getContext());
		imgView.setImageResource(android.R.drawable.ic_menu_myplaces);
		parentLayear.addView(imgView);
		parentLayear.addView(leftLayear);
		// CALL BUTTON
		ImageButton callBtn = new ImageButton(getView().getContext());
		callBtn.setImageResource(android.R.drawable.ic_menu_call);
		
		// TableRowに列を追加
		returnRow.addView(parentLayear);
		returnRow.addView(callBtn);
		return returnRow;
	}
	
	/**
	 * 年月情
	 */
	private String getDateTime(Calendar cal) {
		
		// 成形時間情報
		StringBuilder dateTime = new StringBuilder();
		dateTime.append(cal.get(Calendar.YEAR));
		dateTime.append("/");
		dateTime.append(cal.get(Calendar.MONTH) + 1);
		dateTime.append("/");
		dateTime.append(cal .get(Calendar.DAY_OF_WEEK));
		dateTime.append(" ");
		dateTime.append(String.format("%1$02d", cal.get(Calendar.HOUR_OF_DAY)));
		dateTime.append(":");
		dateTime.append(String.format("%1$02d", cal.get(Calendar.MINUTE)));

		return dateTime.toString();
	}
}
